干货 | 模型优化不得不思考的几个问题
胡淏,美团算法工程师,毕业于哥伦比亚大学。先后在携程、支付宝、美团从事算法开发工作。了解风控、基因、旅游、即时物流相关问题的行业领先算法方案与流程。本文来自胡淏在“携程技术沙龙——云海机器学习Meetup”上的分享。
*视频由“IT大咖说”提供,时长约73分钟,请在WiFi环境下观看*
https://v.qq.com/txp/iframe/player.html?vid=x0397y7cwzp&width=500&height=375&auto=0
我们平时都在积累自己的“弹药库”:分类、回归、无监督模型,kaggle上面特征变换的黑魔法,样本失衡的处理方法,缺失值填充... 大概可以归类成模型和特征两个点。我们在每个点都已经做得很好,所以我们都拥有一张绿卡,跨过了在数据相关行业发挥模型技术价值的准入门槛。
在这个时候,比较关键的下一步,就是高效的技术变现能力,所谓高效,就是解决业务核心问题的专业能力。这篇文章就在描述这些专业能力,也就是模型优化的四个要素:模型、数据、特征、业务,还有更重要的,他们在模型项目中的优先级。
本文首先综合介绍模型项目的优先级,模型项目推进的四个要素,并按照优先级顺序依次展开四个要素细节实施过程中需要注意的方方面面。
图1
模型项目推进的四要素
模型优化,离不开这四个要素:模型、数据、特征、业务。
项目推进过程中,四个要素相互之间的优先级大致是:业务 > 特征 > 数据> 模型。
图2:四要素解决问题细分 + 优先级
业务
一个模型项目有好的技术选型,完备的特征体系,高质量的数据一定是很加分的,不过有个大前提决定项目的好与坏,就是这个项目的技术目标是否在解决当下核心业务问题。
业务问题包含两个方面,业务kpi和deadline。比如,如果业务问题是:在两周之内降低目前手机丢失带来的支付宝销赃风险,这时如果你的方案是研发手机丢失的核心特征,比如改密是否合理,基本上就死的很惨,因为两周根本完不成,改密合理性也未必是模型优化好的切入点;反之,如果你的方案是和运营同学看bad case,梳理现阶段的作案通用手段,并通过分析上线一个简单模型或者业务规则的补丁,就明智很多。如果上线后,案件量真掉了下来,就算你的方案准确率很糟,方法很low,但你解决了业务问题,这才是最重要的。
虽然业务目标很关键,不过一般讲,业务运营同学真的不太懂得如何和技术有效的沟通业务目标,比如:
我们想做一个线下门店风险评级的项目,希望你们通过反作弊模型角度帮我们把门店打个分(问题:风险是怎么定义的?为什么要做风险评级,更大的业务目标是什么,怎么排期的?这个风险和我们反作弊模型之间的业务关系,你是怎么看的?)
是否可以做一个区域未来10min的配送时间预估模型?我们想通过你们的模型衡量在恶劣天气的时候每个区域的运力是否被击穿 (业务现状和排期?运力被击穿可以扫下盲么?运力击穿和配送时间之间是个什么业务逻辑,时间预估是刻画运力紧张度的最有效手段么?项目的关键场景是恶劣天气的话,我们仅仅训练恶劣天气场景的时间预估模型是否就好了?)
为了保证整个技术项目没有做偏,项目一开始,一定和业务聊清楚三件事情:
1、业务核心问题、关键场景是什么
2、如何评估该项目的成功?指标是什么
3、通过项目输出什么关键信息给到业务,业务如何运营这个信息从而达到业务目标?
项目过程中,也要时刻回到业务,检查项目的健康度。
数据、特征
要说正确的业务理解和切入,在为技术项目保驾护航,数据、特征便是一个模型项目性能方面的天花板。
garbage in, garbage out就在说这个问题。这两天有位听众微信问我一个很难回答的问题,大概意思是,数据是特征拼起来构成的集合嘛,所以这不是两个要素。从逻辑上面讲,数据的确是一列一列的特征,不过数据与特征在概念层面是不同的:数据是已经采集的信息,特征是以兼容模型、最优化为目标对数据进行加工。就比如通过word2vec将非结构化数据结构化,就是将数据转化为特征的过程。
所以,我更认为特征工程是基于数据的一个非常精细、刻意的加工过程。从传统的特征转换、交互,到embedding、word2vec、高维分类变量数值化,最终目的都是更好的去利用现有的数据。之前有聊到的将推荐算法引入有监督学习模型优化中的做法,就是在把两个本不可用的高维ID类变量变成可用的数值变量。
不过我普遍观察到自己和童鞋在特征工程中遇到的问题,比如,特征设计不全面,没有耐心把现有特征做得细致... 也整理出来一套方法论,仅做参考:
图3 变量体系、研发流程
在特征设计的时候,有两个点可以帮助我们把特征想的更全面:
1、现有的基础数据
2、业务“二维图”
这两个方面的整合,就是一个变量的体系。变量(特征),从技术层面是加工数据,而从业务层面,实际在反应RD的业务理解和数据刻画业务能力。“二维图”,实际上未必是二维的,更重要的是我们需要把业务整个流程抽象成几个核心的维度,举几个例子:
外卖配送时间业务 (维度甲:配送的环节,骑手到点、商家出餐、骑手配送、交付用户;维度乙:颗粒度,订单粒度、商家粒度、区域城市粒度;维度丙:配送类型,众包、自营...)
反作弊变量体系(维度甲:作弊环节,登录、注册、实名、转账、交易、参与营销活动、改密... 乙:作弊介质,账户、设备、IP、wifi、银行卡...)
通过这些维度,你就可以展开一个“二维图”,把现有你可以想到的特征填上去,你一定会发现很多空白,比如下图,那么在哪里还是特征设计的盲点就一目了然:
图4 账户维度在转账、红包方面的特征很少;没有考虑wifi这个媒介;客满与事件数据没考虑。
数据、和特征决定了模型性能的天花板。deep learning当下在图像、语音、机器翻译、自动驾驶等领域非常火,但是deeplearning在生物信息、基因学这个领域就不是热词:这背后是因为在前者,我们已经知道数据从哪里来,怎么采集,这些数据带来的信息基本满足了模型做非常准确的识别;而后者,即便有了上亿个人体碱基构成的基因编码,技术选型还是不能长驱直入--超高的数据采集成本,人后天的行为数据的获取壁垒等一系列的问题,注定当下这个阶段在生物信息领域,人工智能能发出的声音很微弱,更大的舞台留给了生物学、临床医学、统计学。
模型
模型这件事儿,许多时候追求的不仅仅是准确率,通常还有业务这一层更大的约束。如果你在做一些需要强业务可解释的模型,比如定价和反作弊,那实在没必要上一个黑箱模型来为难业务。这时候,统计学习模型就很有用,这种情况下,比拼性能的话,我觉得下面这个不等式通常成立:glmnet > LASSO >= Ridge > LR/Logistic. 相比最基本的LR/Logistic,ridge通过正则化约束缓解了LR在过拟合方面的问题,lasso更是通过L1约束做类似变量选择的工作。
不过两个算法的痛点是很难决定最优的约束强度,glmnet是Stanford给出的一套非常高效的解决方案。所以目前,我认为线性结构的模型,glmnet 的痛点是最少的,在R、Python、Spark上面都开源了。
如果我们开发复杂模型,通常成立第二个不等式 RF <= GBDT <= xgboost. 拿数据说话,29个kaggle公开的winner solution里面,17个使用了类似gbdt这样的boosting框架,其次是DNN,RF的做法在kaggle里面非常少见。
RF和GBDT的雏形,CART是两位作者在84年合作推出的。但是在90年代在发展模型集成思想the ensemble的时候,两位作者代表着两个至今也很主流的派系:stacking/ bagging & boosting.
一种是把相互独立的cart (randomized variables, bootstrapsamples)水平铺开,一种是深耕的boosting,在拟合完整体后更有在局部长尾精细刻画的能力。同时,gbdt模型相比rf更加简单,内存占用小,这都是业界喜欢的性质。xgboost在模型的轻量化和快速训练上又做了进一步的工作,也是目前我们比较喜欢尝试的模型。
图6 The Child of RF&GBDT
下载PPT请戳文章底部“阅读原文”。
推荐阅读:
*作为上海互联网领军企业,携程致力于营造上海的技术交流氛围,为技术圈小伙伴搭建更好的交流沟通平台,共同成长进步。也欢迎有同样想法的小伙伴,来沟通合作,邮件niuq@ctrip.com*